﻿#pragma once

#include "PipelineBase.h"
#include <QAtomicInteger>

class UnstackPlate;
class Boxline;
class WCSSend;
class PipelineUnstack : public PipelineBase
{
public:
	PipelineUnstack();
	~PipelineUnstack();
	virtual bool Init() override;
	virtual int IfTaskAvailable(const QByteArray& task) override;
	/****************************************************************************
	 * 功能: 任务初始化操作，由项目具体实现
	 * 返回值: true：执行成功，业务线切换到任务初始化完成状态
	 ****************************************************************************/
	virtual bool TaskInit() override;
	/****************************************************************************
	 * 功能: 判断任务启动条件是否具备
	 * 返回值:true：任务可以启动，业务线切换到任务开始状态
	 ****************************************************************************/
	virtual bool IfTaskStarted() override;

	/****************************************************************************
	 * 功能: 判断任务是否准备完成
	 * 返回值: true: 任务已经准备完成，直接进入任务等待状态
	 ****************************************************************************/
	virtual bool IfTaskPrepared() override;

	/****************************************************************************
	 * 功能: 用于生成新节拍
	 * 返回值: 0：节拍生成成功，业务线切换到节拍准备完成状态，1：生成条件不足， -1：生成失败
	 ****************************************************************************/
	virtual int StepPrepare() override;

	/****************************************************************************
	 * 功能: 任务完成处理操作， 任务完成状态时被调用
	 * 返回值: true 表示成功
	 ****************************************************************************/
	virtual bool TaskFinish() override;

	virtual bool TaskContinue() override;

	/*路径执行前操作*/
	virtual bool PathStart(const QString& path) override;
	virtual bool SendNotifyer(int type) override;
	virtual bool  TakePicture() override;
	/*路径执行后特殊操作*/
	virtual bool PathEnd(const QString& path) override;

private:
	bool CheckTaskData(const QByteArray& data);
	bool SendArriveInfo();


private:
	int m_stepId = 0;
	WCSSend* m_wcs = nullptr;
	Boxline* m_put = nullptr;
	UnstackPlate* m_pick = nullptr;
	QAtomicInteger<bool> m_snapflag = false;	// 拍照标志位
};
